Socket Errors হলো Socket Programming-এ বিভিন্ন ধরণের সমস্যা বা ত্রুটি, যা Socket তৈরি, সংযোগ, ডেটা পাঠানো বা গ্রহণ করার সময় ঘটতে পারে। নেটওয়ার্ক এবং সিস্টেমের কার্যক্রমে ত্রুটি থাকলে Socket Errors ঘটতে পারে। Socket Errors সঠিকভাবে হ্যান্ডেল না করলে অ্যাপ্লিকেশন ক্র্যাশ হতে পারে বা অনির্দেশ্য আচরণ করতে পারে। নিচে সাধারণ কিছু Socket Errors এবং তাদের সমাধান নিয়ে আলোচনা করা হলো।
Error: EADDRINUSE
(Address Already in Use)
SO_REUSEADDR
অপশন সেট করুন, যাতে Socket একই Address এবং Port পুনরায় ব্যবহার করতে পারে।int opt = 1;
setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
Error: ECONNREFUSED
(Connection Refused)
Error: ETIMEDOUT
(Connection Timed Out)
Error: EHOSTUNREACH
(No Route to Host)
Error: EPIPE
(Broken Pipe)
poll()
বা select()
ফাংশন ব্যবহার করতে পারেন।Error: ENOTCONN
(Socket Not Connected)
connect()
কল সফল হয়েছে।connect()
কল করার পরে, Socket-এর অবস্থা যাচাই করুন এবং সফল সংযোগ না হলে ত্রুটি হ্যান্ডেল করুন।Error: EACCES
(Permission Denied)
Error: EAGAIN
বা EWOULDBLOCK
(Operation Would Block)
poll()
বা select()
ফাংশন ব্যবহার করে Socket Ready হওয়ার জন্য অপেক্ষা করুন।Socket Errors সঠিকভাবে হ্যান্ডল করার জন্য errno
ব্যবহার করে সিস্টেম ত্রুটি চেক করা যায়। errno
একটি গ্লোবাল ভেরিয়েবল, যা সর্বশেষ সিস্টেম কলের ত্রুটির কোড ধারণ করে। নিচে একটি উদাহরণ দেওয়া হলো:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <arpa/inet.h>
#include <string.h>
#define PORT 8080
int main() {
int sockfd;
struct sockaddr_in server_addr;
// ক্লায়েন্ট socket তৈরি করা
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0) {
perror("Socket creation failed");
exit(EXIT_FAILURE);
}
// সার্ভার ঠিকানা সেটআপ করা
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(PORT);
server_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
// সার্ভারের সাথে সংযোগের চেষ্টা করা
if (connect(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0) {
if (errno == ECONNREFUSED) {
printf("Connection refused by the server.\n");
} else if (errno == ETIMEDOUT) {
printf("Connection timed out.\n");
} else {
perror("Connection failed");
}
close(sockfd);
exit(EXIT_FAILURE);
}
printf("Connected to the server.\n");
close(sockfd);
return 0;
}
Error Logging:
perror()
বা strerror(errno)
ব্যবহার করে ত্রুটি সম্পর্কে বিস্তারিত তথ্য পাওয়া যায়।Retry Mechanism:
EAGAIN
বা EWOULDBLOCK
, আবার চেষ্টা করার মাধ্যমে সমাধান করা যেতে পারে। সঠিকভাবে Retry করা হলে Non-Blocking Socket ব্যবহার করা যায়।Timeout এবং Retry Limit:
Graceful Shutdown:
Common Socket Errors হলো Socket Programming-এ বিভিন্ন ধরনের ত্রুটি, যা সংযোগ স্থাপন, ডেটা পাঠানো বা গ্রহণের সময় ঘটে। প্রতিটি ত্রুটি একটি নির্দিষ্ট পরিস্থিতিকে নির্দেশ করে এবং সেগুলোর সমাধান ভিন্ন হতে পারে। এখানে EADDRINUSE
, ECONNRESET
, এবং ETIMEDOUT
ত্রুটির কারণ এবং সমাধান নিয়ে বিস্তারিত আলোচনা করা হলো।
EADDRINUSE
(Address Already in Use)SO_REUSEADDR
অপশন ব্যবহার করে একই Address এবং Port পুনরায় ব্যবহার করার অনুমতি দিন। এটি বিশেষত সার্ভার প্রোগ্রামিংয়ে কার্যকর, যখন সার্ভারটি দ্রুত পুনরায় চালু করতে হয়।int opt = 1;
setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
নিশ্চিত করুন যে একই Port অন্য কোনো প্রক্রিয়া ব্যবহার করছে কিনা। প্রয়োজনে netstat
বা lsof
এর মতো কমান্ড ব্যবহার করে চেক করুন এবং বন্ধ করুন।
অন্য একটি Port ব্যবহার করুন, যাতে সংঘর্ষ এড়ানো যায়।
ECONNRESET
(Connection Reset by Peer)select()
বা poll()
ফাংশনের মাধ্যমে করা যায়।ECONNRESET
ত্রুটি হ্যান্ডেল করার জন্য উপযুক্ত রিকভারী মেকানিজম ব্যবহার করুন, যেমন: পুনরায় সংযোগের চেষ্টা বা ব্যাকআপ সার্ভার ব্যবহার করা।ETIMEDOUT
(Connection Timed Out)struct timeval timeout;
timeout.tv_sec = 5; // 5 সেকেন্ডের জন্য টাইমআউট সেট করা
timeout.tv_usec = 0;
setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, (const char*)&timeout, sizeof(timeout));
ত্রুটি | কারণ | সমাধান |
---|---|---|
EADDRINUSE | Port-এ Address ইতোমধ্যে ব্যবহৃত | SO_REUSEADDR ব্যবহার করে পুনরায় ব্যবহার করার অনুমতি দিন, অথবা অন্য Port ব্যবহার করুন। |
ECONNRESET | সংযোগের অন্য প্রান্ত হঠাৎ সংযোগ বন্ধ করেছে | সংযোগের অবস্থা যাচাই করুন এবং পুনরায় সংযোগের চেষ্টা করুন। লোগিং এবং ডায়াগনস্টিক তথ্য সংগ্রহ করুন। |
ETIMEDOUT | সংযোগে সময়মতো সাড়া পাওয়া যায়নি | ক্লায়েন্ট ও সার্ভারের নেটওয়ার্ক কানেকশন এবং কনফিগারেশন যাচাই করুন। টাইমআউট সেট করুন এবং পুনরায় চেষ্টা করুন। |
Error Checking Techniques Socket Programming এবং নেটওয়ার্ক প্রোগ্রামিংয়ে সঠিকভাবে ত্রুটি শনাক্ত এবং হ্যান্ডেল করতে ব্যবহৃত হয়। ত্রুটি সঠিকভাবে চেক এবং হ্যান্ডেল না করা হলে অ্যাপ্লিকেশন ক্র্যাশ হতে পারে বা অপ্রত্যাশিত আচরণ করতে পারে। নীচে কিছু গুরুত্বপূর্ণ Error Checking Techniques এবং তাদের ব্যবহার নিয়ে বিস্তারিত আলোচনা করা হলো।
প্রত্যেক সিস্টেম কল বা ফাংশন সাধারণত একটি Return Value প্রদান করে, যা ফাংশনের সাফল্য বা ব্যর্থতা নির্দেশ করে। এই Return Value চেক করা একটি সাধারণ এবং গুরুত্বপূর্ণ পদ্ধতি।
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0) {
perror("Socket creation failed");
exit(EXIT_FAILURE);
}
socket()
ফাংশন একটি sockfd
(Socket Descriptor) ফেরত দেয়। যদি এটি -1
হয়, তবে ত্রুটি ঘটেছে। perror()
ব্যবহার করে ত্রুটি বার্তা প্রিন্ট করা হয় এবং প্রোগ্রাম বন্ধ করা হয়।errno
ব্যবহারerrno
হলো একটি গ্লোবাল ভেরিয়েবল, যা সর্বশেষ সিস্টেম কল বা লাইব্রেরি ফাংশনের ত্রুটির কোড সংরক্ষণ করে। errno
এর সাহায্যে ত্রুটি শনাক্ত এবং নির্দিষ্ট ত্রুটির জন্য হ্যান্ডেল করা যায়।
#include <errno.h>
#include <stdio.h>
#include <string.h>
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0) {
printf("Error: %s\n", strerror(errno));
exit(EXIT_FAILURE);
}
errno
এর মান strerror()
ফাংশনের মাধ্যমে String Message-এ রূপান্তর করে ত্রুটি সম্পর্কে বিস্তারিত তথ্য পাওয়া যায়।errno
ব্যবহার করে ত্রুটির কোড অনুযায়ী নির্দিষ্ট হ্যান্ডলিং করা সম্ভব, যেমন:if (errno == EADDRINUSE) {
printf("Address is already in use. Try another port.\n");
}
perror()
ব্যবহারperror()
একটি সহজ পদ্ধতি, যা ত্রুটির বার্তা প্রিন্ট করে এবং সিস্টেমের ত্রুটি কোড অনুযায়ী তথ্য প্রদর্শন করে। এটি errno
এর মান ব্যবহার করে কাজ করে এবং ত্রুটির উৎস সম্পর্কে স্পষ্ট বার্তা দেয়।
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0) {
perror("Socket creation failed");
exit(EXIT_FAILURE);
}
perror()
ফাংশন একটি বিস্তারিত বার্তা প্রিন্ট করবে, যেমন: "Socket creation failed: Address already in use".perror()
একটি সংক্ষিপ্ত এবং কার্যকর উপায় ত্রুটির বার্তা প্রিন্ট করার জন্য।সাধারণ ত্রুটি হ্যান্ডলিংয়ের পাশাপাশি, উন্নত অ্যাপ্লিকেশনগুলোতে Custom Error Logging ব্যবহার করা হয়, যা ত্রুটি বার্তা লগ ফাইলে সংরক্ষণ করে। এটি ত্রুটির ইতিহাস সংরক্ষণ এবং অ্যাপ্লিকেশন ডিবাগিংয়ের জন্য গুরুত্বপূর্ণ।
#include <stdio.h>
#include <errno.h>
#include <string.h>
void log_error(const char *message) {
FILE *logfile = fopen("error_log.txt", "a");
if (logfile) {
fprintf(logfile, "%s: %s\n", message, strerror(errno));
fclose(logfile);
}
}
int main() {
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0) {
log_error("Socket creation failed");
exit(EXIT_FAILURE);
}
// অন্যান্য কোড
return 0;
}
log_error()
ফাংশন ব্যবহার করে ত্রুটি বার্তা এবং errno
এর ভিত্তিতে বিস্তারিত বার্তা লগ ফাইলে সংরক্ষণ করা হয়।Assertions কোডে এমন জায়গায় ব্যবহৃত হয়, যেখানে একটি নির্দিষ্ট শর্ত সত্য হওয়া আবশ্যক। Assertion ব্যর্থ হলে, এটি একটি ত্রুটি বার্তা প্রদর্শন করে এবং প্রোগ্রাম বন্ধ করে। এটি কোডে সম্ভাব্য বাগ বা সমস্যা শনাক্ত করতে ব্যবহৃত হয়।
#include <assert.h>
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
assert(sockfd >= 0);
sockfd
একটি বৈধ মান না ফেরত দেয় (অর্থাৎ, -1
), তবে Assertion ব্যর্থ হবে এবং প্রোগ্রাম বন্ধ হয়ে যাবে।ত্রুটি হ্যান্ডলিংয়ের সময় Timeout এবং Retry মেকানিজম প্রয়োগ করা যায়, বিশেষত নেটওয়ার্ক সংযোগ এবং ডেটা ট্রান্সমিশনের ক্ষেত্রে।
struct timeval timeout;
timeout.tv_sec = 5; // 5 সেকেন্ডের জন্য টাইমআউট
timeout.tv_usec = 0;
setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof(timeout));
perror()
এবং strerror()
ফাংশন দুটি Socket Programming এবং অন্যান্য সিস্টেম প্রোগ্রামিংয়ের ক্ষেত্রে ত্রুটি বার্তা প্রদর্শন করার জন্য ব্যবহৃত হয়। এগুলো ত্রুটির উৎস সম্পর্কে বিস্তারিত এবং ব্যবহারযোগ্য তথ্য প্রদান করে, যা ডিবাগিং এবং ত্রুটি শনাক্ত করতে অত্যন্ত সহায়ক। নিচে perror()
এবং strerror()
ফাংশনের ব্যবহার নিয়ে বিস্তারিত আলোচনা করা হলো।
perror()
perror()
ফাংশনটি একটি সহজ পদ্ধতি, যা সিস্টেম ত্রুটি (যেমন, সিস্টেম কল বা লাইব্রেরি ফাংশনের ত্রুটি) শনাক্ত করে এবং সঠিক ত্রুটি বার্তা প্রদর্শন করে। এটি errno
এর মান ব্যবহার করে কাজ করে এবং বার্তার শেষে ত্রুটির ব্যাখ্যা প্রদান করে।
perror()
এর সিগনেচার (C ভাষায়)void perror(const char *message);
message
: ব্যবহারকারীর প্রদত্ত একটি বার্তা, যা ত্রুটির সাথে সম্পর্কিত তথ্য দেয়।perror()
errno
এর মান অনুযায়ী সিস্টেম ত্রুটি প্রদর্শন করে।perror()
এর উদাহরণ (C ভাষায়)#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <errno.h>
int main() {
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0) {
perror("Socket creation failed");
exit(EXIT_FAILURE);
}
return 0;
}
perror()
ফাংশন Socket creation failed:
বার্তা প্রদর্শন করবে এবং এর সাথে errno
এর মান অনুযায়ী ত্রুটি সম্পর্কে বিস্তারিত তথ্য দেখাবে, যেমন:Socket creation failed: Address already in use
perror()
গুরুত্বপূর্ণ:errno
এর মান পড়ে এবং সিস্টেম ত্রুটির জন্য উপযুক্ত বার্তা প্রদান করে।strerror()
strerror()
ফাংশনটি errno
ত্রুটি কোডের উপর ভিত্তি করে একটি বিস্তারিত ত্রুটি বার্তা প্রদান করে। এটি একটি স্ট্রিং ফিরিয়ে দেয়, যা ব্যবহারকারী কাস্টম বার্তা বা লগ ফাইলে ব্যবহার করতে পারেন।
strerror()
এর সিগনেচার (C ভাষায়)char *strerror(int errnum);
errnum
: errno
ত্রুটি কোড বা অন্য কোনো নির্দিষ্ট ত্রুটি কোড।strerror()
এর উদাহরণ (C ভাষায়)#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
int main() {
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0) {
printf("Error: %s\n", strerror(errno));
exit(EXIT_FAILURE);
}
return 0;
}
strerror(errno)
ত্রুটি কোডের উপর ভিত্তি করে একটি String প্রদান করবে, যা ত্রুটির বিস্তারিত তথ্য দেখাবে, যেমন:Error: Address already in use
strerror()
গুরুত্বপূর্ণ:strerror()
ব্যবহার করে কাস্টম বার্তা তৈরি করা যায় এবং ত্রুটি লগ ফাইলে সংরক্ষণ করা যায়, যা ডিবাগিং এবং অ্যাপ্লিকেশন মনিটরিংয়ে সহায়ক।errno
ছাড়াও অন্য কোনো ত্রুটি কোডও গ্রহণ করতে পারে, যার ফলে বিভিন্ন পরিস্থিতিতে এটি ব্যবহার করা যায়।perror()
বনাম strerror()
বৈশিষ্ট্য | perror() | strerror() |
---|---|---|
ব্যবহার | ত্রুটি বার্তা সরাসরি প্রিন্ট করে। | ত্রুটির জন্য একটি String ফেরত দেয়। |
ইনপুট | ব্যবহারকারীর প্রদত্ত বার্তা এবং errno । | errno বা নির্দিষ্ট ত্রুটি কোড। |
ফ্লেক্সিবিলিটি | সরাসরি প্রিন্টিং এর জন্য সহজ। | কাস্টম বার্তা বা লগিংয়ের জন্য ব্যবহারযোগ্য। |
ফর্ম্যাট | message: system error message | কেবল সিস্টেম ত্রুটির বার্তা ফিরিয়ে দেয়। |
perror()
এবং strerror()
একত্রে ব্যবহার করার উদাহরণ#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
void log_error(const char *message) {
FILE *logfile = fopen("error_log.txt", "a");
if (logfile) {
fprintf(logfile, "%s: %s\n", message, strerror(errno));
fclose(logfile);
}
}
int main() {
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0) {
perror("Socket creation failed");
log_error("Socket creation failed");
exit(EXIT_FAILURE);
}
return 0;
}
perror()
সরাসরি ত্রুটি বার্তা প্রদর্শন করে, এবং strerror()
একটি String ফিরিয়ে দিয়ে ত্রুটি বার্তা লগ ফাইলে সংরক্ষণ করে। এটি ত্রুটি চেকিং এবং লগিংয়ের জন্য একটি কার্যকর পদ্ধতি।
Socket প্রোগ্রামিংয়ে বিভিন্ন ধরনের ত্রুটি দেখা দিতে পারে, যেমন সংযোগের সমস্যা, টাইমআউট, নেটওয়ার্ক সমস্যা বা অকার্যকর ডেটা। এই সমস্যাগুলির সঠিকভাবে মোকাবেলা করা অত্যন্ত গুরুত্বপূর্ণ, যাতে অ্যাপ্লিকেশনটি নির্ভরযোগ্য এবং স্থিতিশীল থাকে। সঠিকভাবে error handling না করলে অনেক সময়ে নেটওয়ার্কের সমস্যা দেখা দিতে পারে যা অ্যাপ্লিকেশন বা সিস্টেমের কার্যক্ষমতা কমিয়ে দিতে পারে।
এখানে socket error handling এর জন্য কিছু গুরুত্বপূর্ণ কৌশল আলোচনা করা হলো।
সব socket সম্পর্কিত ফাংশনগুলি সফলভাবে শেষ হওয়ার পর একটি রিটার্ন ভ্যালু প্রদান করে। সকেট তৈরি, সংযোগ স্থাপন, ডেটা পাঠানো বা গ্রহণ করার পর প্রতিটি ফাংশনের রিটার্ন ভ্যালু চেক করা উচিত।
int server_socket = socket(AF_INET, SOCK_STREAM, 0);
if (server_socket == -1) {
perror("Socket creation failed");
exit(EXIT_FAILURE);
}
import socket
try:
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
except socket.error as e:
print(f"Socket creation failed: {e}")
exit(1)
errno
বা Error Codes ব্যবহার করাSocket অপারেশন ব্যর্থ হলে, একটি ত্রুটি কোড সাধারণত সেট করা হয়। C ভাষায়, এটি errno
গ্লোবাল ভেরিয়েবল ব্যবহার করে পাওয়া যায়, আর Python-এ exception এর মাধ্যমে ত্রুটি চিহ্নিত করা যায়।
#include <errno.h>
#include <string.h>
if (bind(server_socket, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0) {
if (errno == EADDRINUSE) {
fprintf(stderr, "Address is already in use\n");
} else {
perror("Bind failed");
}
close(server_socket);
exit(EXIT_FAILURE);
}
import socket
try:
server_socket.bind(('localhost', 65432))
except socket.error as e:
if e.errno == 98: # Address already in use (Unix error code)
print("Address already in use")
else:
print(f"Bind failed: {e}")
server_socket.close()
exit(1)
Socket অপারেশন যেমন recv()
বা accept()
ব্লক হয়ে থাকতে পারে যদি কোনো ডেটা না আসে বা ক্লায়েন্ট সংযোগ না করে। এই সমস্যা এড়াতে টাইমআউট সেট করা উচিত।
#include <sys/select.h>
struct timeval timeout;
timeout.tv_sec = 10; // 10 সেকেন্ড টাইমআউট
timeout.tv_usec = 0;
fd_set readfds;
FD_ZERO(&readfds);
FD_SET(server_socket, &readfds);
int activity = select(server_socket + 1, &readfds, NULL, NULL, &timeout);
if (activity == -1) {
perror("Select error");
} else if (activity == 0) {
printf("Timeout occurred. No data received.\n");
} else {
// Handle connection or data reception
}
import socket
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.settimeout(10) # 10 সেকেন্ডের টাইমআউট
try:
data = server_socket.recv(1024)
except socket.timeout:
print("Timeout occurred while receiving data")
except socket.error as e:
print(f"Socket error: {e}")
TCP কনেক্ট করার সময় যদি সার্ভার অবরুদ্ধ থাকে বা পোর্ট বন্ধ থাকে, তাহলে সংযোগ ব্যর্থ হতে পারে। এসব সমস্যা চিহ্নিত করা এবং সঠিকভাবে হ্যান্ডেল করা গুরুত্বপূর্ণ।
int client_socket = socket(AF_INET, SOCK_STREAM, 0);
if (client_socket == -1) {
perror("Socket creation failed");
exit(EXIT_FAILURE);
}
if (connect(client_socket, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0) {
perror("Connection failed");
close(client_socket);
exit(EXIT_FAILURE);
}
import socket
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.settimeout(5) # Connection timeout
try:
client_socket.connect(('localhost', 65432))
except socket.timeout:
print("Connection timed out")
except socket.error as e:
print(f"Connection failed: {e}")
Socket বন্ধ করার সময় নিশ্চিত করুন যে, সঠিকভাবে সংযোগ বন্ধ হচ্ছে, যাতে কোনো ডেটা হারানো না হয় এবং সংযোগটি সঠিকভাবে বন্ধ হয়।
if (shutdown(client_socket, SHUT_RDWR) < 0) {
perror("Shutdown failed");
}
close(client_socket);
client_socket.shutdown(socket.SHUT_RDWR)
client_socket.close()
যখন একটি সকেট বন্ধ করা হয় এবং আপনি ঐ সকেটে ডেটা পাঠানোর চেষ্টা করেন, তখন "broken pipe" ত্রুটি হতে পারে। এই ধরনের ত্রুটি মোকাবেলা করা জরুরি।
signal(SIGPIPE, SIG_IGN); // Ignore SIGPIPE signal
ssize_t bytes_sent = send(client_socket, data, sizeof(data), 0);
if (bytes_sent == -1) {
perror("Send failed");
}
try:
client_socket.sendall(b"Hello, server!")
except BrokenPipeError:
print("Connection closed by the peer.")
Resources যেমন socket descriptors, buffers, এবং memory মুক্ত করা গুরুত্বপূর্ণ, বিশেষ করে যখন সকেট আর প্রয়োজনীয় না হয়। Resources লিক হতে পারে এবং পারফরম্যান্স কমিয়ে দিতে পারে।
close(client_socket); // Close socket when done
client_socket.close()
যখন একটি সার্ভারের ডোমেইন নাম ব্যবহার করে সংযোগ স্থাপন করা হয়, তখন DNS রেজলিউশন ব্যর্থ হতে পারে। DNS রেজলিউশন সফল হয়েছে কিনা, তা যাচাই করা উচিত এবং ব্যর্থ হলে সঠিকভাবে হ্যান্ডেল করা উচিত।
struct hostent *server;
server = gethostbyname("localhost");
if (server == NULL) {
fprintf(stderr, "No such host\n");
exit(0);
}
try:
server_ip = socket.gethostbyname("localhost")
except socket.gaierror:
print("DNS resolution failed")
Socket error handling সঠিকভাবে না করলে নেটওয়ার্ক অ্যাপ্লিকেশনগুলির স্থিতিশীলতা কমে যেতে পারে এবং ব্যবহারকারীরা সমস্যা সম্মুখীন হতে পারে। এই সমস্যাগুলির মোকাবেলা করার জন্য সঠিক error codes চেক করা, timeout handling, connection failures এর জন্য প্রস্তুত থাকা, এবং graceful shutdown সহ নানা কৌশল প্রয়োগ করা অত্যন্ত গুরুত্বপূর্ণ। এসব কৌশল ব্যবহার করে আপনি একটি কার্যকরী এবং স্থিতিশীল নেটওয়ার্ক অ্যাপ্লিকেশন তৈরি করতে পারবেন।
common.read_more